基础
摩尔型状态机/自动机:输出只取决于
例子1(电梯)

输入分2种:
- E1, E2:指的是电梯上的按钮
- End1, End2:指的是限位器之类的
输出则是:
- U=1:往上运行
- D=1:往下运行
- D=U=0:静止
最普通的想法可能就是建模2个状态,在一楼和在二楼。但在这种模型中,一般2个状态中间的转变是瞬间的。所以为了更贴合现实,我们最好设置4个状态:
- 在1楼,在2楼
- 上升,下降

当我们按了E2按钮后,电梯就会上升。当它触碰到了2楼的限位器,就会停止上升,停留在2楼。
而输出确实只是取决于当前的状态,输入最多算是切换了状态,但是没有直接影响输出。(输入改变了状态,状态决定了输出)
One-Hot Kodierung
想要构造对应的电路图,最简单直接的方法就是用位置来表示状态:

有多少个状态就设置多少个FF (Flip-Flop)。
Binär Kodierung
而二进制编码则讲究用更少的 FF 来表示状态。如果有 $N$ 个状态,只需要 $q=\lceil \log_2 N\rceil$ 个状态位(state bits)。比如说这个例子里就是2:

所以有:

Mikroprogrammierte Steuerwerke(微程序控制器)
Mikroprogrammierte Steuerwerke的核心想法是用存储器查表实现状态机,代替那些电路结构的推理以及实现。
- 用一个存储器实现状态转移函数(Zustandsübergangsfunktion durch einen Speicher)
- 地址(Adresse)由两部分拼出来:
- 当前状态 $Z$(q bit)
- 输入信号/状态变量 $X$(m bit)
- 存储器输出一条微指令(Mikroinstruktion),里面包含:
- 下一状态 $Z’$(q bit)
- 输出信号 $Y$(n bit)
把它想成一个“查表函数”:
其中 $Z | X$ 表示把状态位和输入位拼接成地址。

状态寄存器(FFs)保存当前状态 $Z$,每个时钟沿更新一次
当前状态 $Z$ + 输入 $X$ → 作为 ROM 地址
ROM 输出一条“控制字/微指令”,分两部分:
$Z’$:回写到状态寄存器,成为下一个周期的状态
$Y$:直接作为输出控制信号(例如电机上/下)
例子2(扶梯)

我们现在想建模这个扶梯,可以通过传感器控制往上或者往下。只不过在往上(下)的过程中:
- 如果往上(下)的传感器触发了,就会增加往上(下)的时间
- 往下(上)的传感器无法触发
状态机

图中状态里的tuple是(Stopp, Unten, Oben),停止/往上/往下。而Übergang上的tuple表示的是(s1传感器,s2传感器)。
注意,因为是自动扶梯,所以不存在停留在几楼的问题,状态只有停止,往上和往下。所以把这个图画成三角形的样子会更直观一点:

微程序控制(Microprogrammed Control)

A. Bedingung (条件选择码)
看电路图右下角的 MUX(多路选择器)。它决定了当前检查哪个传感器。
- $s1$ 接在第 0 个位置 $\to$ 代码
000 - $s2$ 接在第 1 个位置 $\to$ 代码
001 - $1$ (常数/True) 接在第 2 个位置 $\to$ 代码
010(意思是“无条件跳转”)
B. Steuersignale (控制信号)
这就是我们上一问里写的 Tuple (Stopp, Unten, Oben)。
- 停止 $\to$
1 0 0 - 向下 $\to$
0 1 0 - 向上 $\to$
0 0 1
C. 逻辑流 (Jump vs. Next)
电路图左边的逻辑是:
- 如果条件满足 (True):跳转到
Folgeadresse(下一列填的地址)。 - 如果条件不满足 (False):执行
Address + 1(也就是单纯的下一行)。
我们把表格分成三块,分别对应状态机的三个圆圈。
第一块:初始/停止状态 (对应 Z0)
目标: 电机停。如果 $S1$ 亮去上,如果 $S2$ 亮去下,否则原地待命。
- 地址 0000:
if (S1) goto oben- Steuer:
1 0 0(保持停止)。 - Bedingung: 检查 $S1$ $\to$ 填
0 0 0。 - Folgeadresse: 填
0 0 1 1(这是下面定义的oben入口地址)。 - 逻辑:S1 没触发就去下一行 0001。
- Steuer:
- 地址 0001:
if (S2) goto unten- Steuer:
1 0 0(保持停止)。 - Bedingung: 检查 $S2$ $\to$ 填
0 0 1。 - Folgeadresse: 填
0 1 1 0(这是下面定义的unten入口地址)。
- Steuer:
- 地址 0010:
goto init(回开头)- Steuer:
1 0 0。 - Bedingung: 总是跳 (常数1) $\to$ 填
0 1 0。 - Folgeadresse: 回到第一行 $\to$ 填
0 0 0 0。
- Steuer:
第二块:向上状态 (对应 Z1, 标签 oben)
目标: 电机上行。只要 $S1$ 在就死循环;$S1$ 没了看 $S2$;$S2$ 也没了就停。
- 地址0011:
while (S1)(死循环维持)- Steuer:
0 0 1(开始输出 Oben=1)。 - Bedingung: 检查 $S1$ $\to$ 填
0 0 0。 - Folgeadresse:
0 0 1 1(跳回自己)。 - 逻辑:只要 S1 是 1,就不断跳回 0011,一直维持输出 Oben。一旦 S1 变成 0,条件不满足,自动掉落到下一行 0100。
- Steuer:
- 地址0100:
if (S2) goto unten(反转逻辑)- Steuer:
0 0 1(依然保持 Oben,因为还在这个逻辑块里)。 - Bedingung: 检查 $S2$ $\to$ 填
0 0 1。 - Folgeadresse:
0 1 1 0(去 Unten)。
- Steuer:
- 地址0101:
goto init(没人了,去停)- Steuer:
0 0 1。 - Bedingung: 无条件 $\to$
0 1 0。 - Folgeadresse:
0 0 0 0(回 Init)。
- Steuer:
第三块:向下状态 (对应 Z2, 标签 unten)
- 地址 0110:
while (S2)- Steuer:
0 1 0(输出 Unten=1)。 - Bedingung: 检查 $S2$ $\to$
0 0 1。 - Folgeadresse:
0 1 1 0(跳回自己)。
- Steuer:
- 地址 0111:
if (S1) goto oben- Steuer:
0 1 0。 - Bedingung: 检查 $S1$ $\to$
0 0 0。 - Folgeadresse:
0 0 1 1(去 Oben)。
- Steuer:
- 地址 1000:
goto init- Steuer:
0 1 0。 - Bedingung: 无条件 $\to$
0 1 0。 - Folgeadresse:
0 0 0 0。
- Steuer: